// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == 'object' && typeof module == 'object')
    // CommonJS
    mod(require('../../lib/codemirror'), require('../../addon/mode/simple'));
  else if (typeof define == 'function' && define.amd)
    // AMD
    define(['../../lib/codemirror', '../../addon/mode/simple'], mod);
  // Plain browser env
  else mod(CodeMirror);
})(function(CodeMirror) {
  'use strict';

  // Collect all Dockerfile directives
  var instructions = [
      'from',
      'maintainer',
      'run',
      'cmd',
      'expose',
      'env',
      'add',
      'copy',
      'entrypoint',
      'volume',
      'user',
      'workdir',
      'onbuild',
    ],
    instructionRegex = '(' + instructions.join('|') + ')',
    instructionOnlyLine = new RegExp(instructionRegex + '\\s*$', 'i'),
    instructionWithArguments = new RegExp(instructionRegex + '(\\s+)', 'i');

  CodeMirror.defineSimpleMode('dockerfile', {
    start: [
      // Block comment: This is a line starting with a comment
      {
        regex: /#.*$/,
        token: 'comment',
      },
      // Highlight an instruction without any arguments (for convenience)
      {
        regex: instructionOnlyLine,
        token: 'variable-2',
      },
      // Highlight an instruction followed by arguments
      {
        regex: instructionWithArguments,
        token: ['variable-2', null],
        next: 'arguments',
      },
      {
        regex: /./,
        token: null,
      },
    ],
    arguments: [
      {
        // Line comment without instruction arguments is an error
        regex: /#.*$/,
        token: 'error',
        next: 'start',
      },
      {
        regex: /[^#]+\\$/,
        token: null,
      },
      {
        // Match everything except for the inline comment
        regex: /[^#]+/,
        token: null,
        next: 'start',
      },
      {
        regex: /$/,
        token: null,
        next: 'start',
      },
      // Fail safe return to start
      {
        token: null,
        next: 'start',
      },
    ],
    meta: {
      lineComment: '#',
    },
  });

  CodeMirror.defineMIME('text/x-dockerfile', 'dockerfile');
});
